# -*- coding: utf-8 -*-
"""
@Time ： 2022/8/18 0:40
@Auth ： Puzzle
@File ：service_captcha.py
@IDE ：PyCharm
@Email： 979497249@qq.com
@Blog:   https://blog.csdn.net/Yanskang

    图形验证码的生成

"""
import base64
import os
import random
from io import BytesIO
from typing import Tuple

from PIL import ImageFont, ImageDraw, Image

import dtcloud


class Captcha(object):
    """
    @param size: 图片的大小，格式（宽，高），默认为(120, 30)
   @param chars: 允许的字符集合，格式字符串
   @param format: 图片保存的格式，默认为 PNG，可选的为 GIF，JPEG，TIFF，PNG
   @param mode: 图片模式，默认为 RGB
   @param bg_color: 背景颜色，默认为白色
   @param fg_color: 前景色，验证码字符颜色，默认为蓝色 #0000FF
   @param font_size: 验证码字体大小
   @param font_file: 验证码字体，默认为 None
   @param length: 验证码字符个数
   @param draw_lines: 是否划干扰线
   @param line_range: 干扰线的条数范围，格式元组，默认为 (1, 2)，只有 draw_lines 为 True 时有效
   @param draw_points: 是否画干扰点
   @param point_chance: 干扰点出现的概率，大小范围 [0, 100]，只有 draw_points 为 True 时有效
   @return: [0]: PIL Image 实例
   @return: [1]: 验证码图片中的字符串
   """

    def __init__(self):
        self.width = dtcloud.tools.config.get('captcha_width', 200)
        self.height = dtcloud.tools.config.get('captcha_height', 50)
        self.chars = dtcloud.tools.config.get('captcha_chars', "0123456789")
        self.format = dtcloud.tools.config.get('captcha_format', 'PNG')
        self.mode = dtcloud.tools.config.get('captcha_mode', "RGB")
        self.bg_color = dtcloud.tools.config.get('captcha_bg_color', (238, 244, 250))
        self.fg_color = dtcloud.tools.config.get('captcha_fg_color', (36, 57, 57))
        self.font_size = int(dtcloud.tools.config.get('captcha_font_size', 25))
        self.length = int(dtcloud.tools.config.get('captcha_length', 4))
        self.BASE_DIR = dtcloud.conf.SITE_ROOT
        self.FONT_DIR = os.path.join(self.BASE_DIR, 'commons/qrcode_and_captcha/fonts')
        self.FONT_FILE = os.path.join(self.FONT_DIR, 'simsun.ttc')

    def generate_captcha(cls) -> Tuple[str, str]:
        # 创建一个新的空白图像
        image = Image.new('RGB', (cls.width, cls.height), color=cls.bg_color)

        # 创建一个画笔对象
        draw = ImageDraw.Draw(image)

        # 创建一个字体对象
        font = ImageFont.truetype(cls.FONT_FILE, cls.font_size)

        # 随机生成 4 个字符作为验证码
        code = ''.join(random.choices(cls.chars, k=cls.length))

        # 将验证码绘制到图像上
        for i in range(cls.length):
            draw.text((10 + i * (cls.width - 20) // 4, cls.height // 2 - cls.font_size // 2),
                      code[i], font=font, fill=(0, 0, 0))

        # 生成干扰线
        # for i in range(random.randint(1, 3)):
        #     x1, y1 = random.randint(0, cls.width), random.randint(0, cls.height)
        #     x2, y2 = random.randint(0, cls.width), random.randint(0, cls.height)
        #     draw.line((x1, y1, x2, y2), fill=(0, 0, 0), width=1)

        # 生成干扰点
        # for i in range(random.randint(10, 30)):
        #     x, y = random.randint(0, cls.width), random.randint(0, cls.height)
        #     draw.point((x, y), fill=(0, 0, 0))
        out = BytesIO()
        image.save(out, format=cls.format)
        data = out.getvalue()
        b64str = base64.b64encode(data).decode()
        return 'data:image/png;base64,' + b64str, code

if __name__ == '__main__':
    print(os.path.dirname(os.path.abspath(__file__)))